﻿using System;
using System.Linq;
using System.Windows.Forms;
using OwnZTec.LojaDelivery.Data;
using System.Collections.Generic;
using System.Data;

namespace OwnZTec.LojaDelivery.UI.WinForms
{
    public partial class FrmDesperdicioDetalhes : OwnZForm
    {

        #region -- Membros e Construtores -------------------------------------------------------------------------------------------------
        public FrmDesperdicio Pai
        {
            get;
            set;
        }

        public bool Edicao
        {
            get;
            set;
        }

        public tbDesperdicioDetalhe DespDetalhe
        {
            get;
            set;
        }

        public tbDesperdicio Desperdicio
        {
            get;
            set;
        }

        private bool _alterado;
        private int Total;


        public FrmDesperdicioDetalhes()
        {
            InitializeComponent();
            this.ConfigurarFormFilho();
        }

        private void FrmDesperdicioDetalhes_Load(object sender, EventArgs e)
        {
            carregado = false;
            dtpData.Value = DateTime.Now;
            cboGrupo.DataSource = Contexto.Db.tbGrupoProdutoes;
            cboGrupo.ValueMember = "idGrupo";
            cboGrupo.DisplayMember = "desNomeGrupo";
            
            listaDetalhes = new List<DespProdutoDetalhes>();

            Carregar();
            cboGrupo.SelectedIndex = -1;
            carregado = true;            
            gvDesperdicio.DataSource = listaDetalhes;
        }

        private bool carregado;
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Eventos ----------------------------------------------------------------------------------------------------------------
        private void cmdSair_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void FrmDesperdicioDetalhes_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!_alterado)
                return;

            var res = Contexto.MainForm.ExibirMensagemSairSemSalvar();

            if (res != DialogResult.Yes)
            {
                e.Cancel = true;
                return;
            }

            Dispose();
        }
        
        private void cmbFuncao_SelectedIndexChanged(object sender, EventArgs e)
        {
            _alterado = true;
        }

        private void cmdSalvar_Click(object sender, EventArgs e)
        {
            Salvar();

            Close();
        }

        private void FrmDesperdicioDetalhes_Closed(object sender, EventArgs e)
        {
            Carregar();

            Pai.AtualizarGrid();
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Metodos ----------------------------------------------------------------------------------------------------------------

        
        public void AtualizarGrid()
        {
            Cursor = Cursors.WaitCursor;

            gvDesperdicio.DataSource = Contexto.Db.tbDesperdicioDetalhes.ToList();//.Where(p => p.idGrupo == cmbGrupoProduto.SelectedValue.ParaInt());

            Cursor = Cursors.Arrow;
        }
        

        private void Salvar()
        {
            if (Desperdicio == null)
                Desperdicio = new tbDesperdicio();

            Desperdicio.dtDesperdicio = dtpData.Value;
            Desperdicio.qtde = Convert.ToInt32(lblTotal.Text);

            if (!Edicao)
                Contexto.Db.tbDesperdicios.AddObject(Desperdicio);

            Contexto.Db.SaveChanges();

            int ID = Desperdicio.idDesperdicio;

            List<DespProdutoDetalhes> lista = (List<DespProdutoDetalhes>)gvDesperdicio.DataSource;



            foreach (DespProdutoDetalhes item in lista)
            {
                if (item.idDetalhes == 0)
                {
                    DespDetalhe = new tbDesperdicioDetalhe();
                    DespDetalhe.idDesperdicio = ID;
                    DespDetalhe.idGrupo = item.idGrupo;
                    DespDetalhe.idProduto = item.idProduto;
                    DespDetalhe.qtde = item.Qtde;
                    Contexto.Db.tbDesperdicioDetalhes.AddObject(DespDetalhe);
                }
                else
                {
                    DespDetalhe = Contexto.Db.tbDesperdicioDetalhes.First(x => x.idDesperdicioDetalhes == item.idDetalhes);
                    DespDetalhe.qtde = item.Qtde;                    
                }
            }

            Contexto.Db.SaveChanges();

            Edicao = true;

            _alterado = false;

            Pai.AtualizarGrid();
        }

        private void Carregar()
        {
            if (Edicao)
            {
                dtpData.Value = Desperdicio.dtDesperdicio;
                lblTotal.Text = Desperdicio.qtde.ToString();
                Total = Desperdicio.qtde;

                //Fazendo o looping para preencher os detalhes
                DespProdutoDetalhes dp = new DespProdutoDetalhes();
                foreach (OwnZTec.LojaDelivery.Data.tbDesperdicioDetalhe item in Contexto.Db.tbDesperdicioDetalhes.ToList().Where(p => p.idDesperdicio == Desperdicio.idDesperdicio))
                {
                    dp = new DespProdutoDetalhes();
                    dp.idDetalhes = item.idDesperdicioDetalhes;
                    dp.idGrupo = item.idGrupo;
                    dp.descGrupo = Contexto.Db.tbGrupoProdutoes.ToList().Find(x => x.idGrupo == item.idGrupo).desNomeGrupo;
                    dp.idProduto = item.idProduto;
                    dp.descProduto = Contexto.Db.tbProdutoes.ToList().Find(y => y.idProduto == item.idProduto).desNomeProduto;
                    dp.Qtde = item.qtde;
                    listaDetalhes.Add(dp);
                }
            }
            else
            {
                Desperdicio = new tbDesperdicio();
            }

            _alterado = false;
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        private List<DespProduto> lista;
        private void cboGrupo_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (carregado)
            {
                cboProdutoRefresh();
            }
        }

        private void cboProdutoRefresh()
        {
            cboProduto.DisplayMember = "descProduto";
            cboProduto.ValueMember = "idProduto";

            lista = new List<DespProduto>();
            DespProduto novo;

            foreach (var item in Contexto.Db.tbProdutoes.ToList().Where(p => p.idGrupo == cboGrupo.SelectedValue.ParaInt()))
            {
                DespProdutoDetalhes compara = listaDetalhes.Find(a => a.idProduto == item.idProduto);
                if (compara == null)
                {
                    novo = new DespProduto();
                    novo.idProduto = item.idProduto;
                    novo.descProduto = item.desNomeProduto;
                    lista.Add(novo);
                }
            }

            cboProduto.DataSource = lista;
        }

        private List<DespProdutoDetalhes> listaDetalhes;
        private void btnAdicionar_Click(object sender, EventArgs e)
        {
            if (dtpData.Value > DateTime.Now)
            {
                MessageBox.Show("Data não pode ser maior do que hoje", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (!String.IsNullOrEmpty(txtQtde.Text.Trim()))
            {
                DespProdutoDetalhes det = new DespProdutoDetalhes();
                det.idGrupo = cboGrupo.SelectedValue.ParaInt();
                det.descGrupo = cboGrupo.Text;
                det.idProduto = cboProduto.SelectedValue.ParaInt();
                det.descProduto = cboProduto.Text;
                det.Qtde = Convert.ToInt16(txtQtde.Text);
                listaDetalhes.Add(det);
                gvDesperdicio.Refresh();
                gvDesperdicio.DataSource = null;
                gvDesperdicio.DataSource = listaDetalhes;

                cboProdutoRefresh();

                Total += Convert.ToInt16(txtQtde.Text);
                lblTotal.Text = Total.ToString();
                txtQtde.Clear();
            }
            else
                MessageBox.Show("Preencha o campo Quantidade", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void gvDesperdicio_CellValueChanged(object sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
        {
            Total = listaDetalhes.Sum(item => item.Qtde);
            lblTotal.Text = Total.ToString();
        }

    }

    public class DespProduto
    {
        public int idProduto { get; set; }
        public string descProduto { get; set; }
    }

    public class DespProdutoDetalhes
    {
        public int idDetalhes { get; set; }
        public int idProduto { get; set; }
        public string descProduto { get; set; }
        public int idGrupo { get; set; }
        public string descGrupo { get; set; }
        public int Qtde { get; set; }
    }
}
